package sq

import (
	"fmt"
)

// Dialect 处理不同SQL数据库的方言。
type Dialect interface {
	GetName() string // GetName 放回当前正在使用的方言(例如:mysql,mssql...)
	Quote(key string) string // Quote 通过使用保留字作为字段名来对字段名加引号，以避免SQL解析异常
}

type commonDialect struct {}

func (commonDialect) GetName() string {
	return "common"
}

func (commonDialect) Quote(key string) string {
	return fmt.Sprintf(`"%s"`, key)
}

// dialectsMap 管理方言的 map 容器。
var dialectsMap = map[string]Dialect{}

// RegisterDialect 注册一个新方言。
func RegisterDialect(name string, dialect Dialect) {
	dialectsMap[name] = dialect
}

// GetDialect 获取指定方言名称的方言。
func GetDialect(name string) (dialect Dialect, ok bool) {
	dialect, ok = dialectsMap[name]
	return
}

// mustGetDialect 内部函数，获取方言，获取失败，内部会panic。
func mustGetDialect(name string) Dialect {
	if dialect, ok := dialectsMap[name]; ok {
		return dialect
	}
	panic(fmt.Sprintf("`%v` is not officially supported", name))
	return nil
}

// newDialect 内部函数，获取<name>对应的方言，如果获取失败，则返回默认的 commonDialect
func newDialect(name string) Dialect {
	if value, ok := GetDialect(name); ok {
		return value
	}
	fmt.Printf("`%v` is not officially supported, running under compatibility mode.\n", name)
	return &commonDialect{}
}
